Amazon DynamoDB হল একটি NoSQL ডেটাবেস যা উচ্চ পারফরম্যান্স এবং স্কেলেবিলিটির জন্য ডিজাইন করা হয়েছে। DynamoDB তে ডেটা অপারেশনগুলি বেশ সহজ এবং দ্রুত হয়, এবং এতে CRUD (Create, Read, Update, Delete) অপারেশনগুলো করা সম্ভব। এখানে DynamoDB তে ডেটা অপারেশন কীভাবে করা যায় তা বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে।
DynamoDB তে নতুন ডেটা ইনসার্ট করার জন্য PutItem
অপারেশন ব্যবহার করা হয়। এটি একটি নির্দিষ্ট টেবিলে একটি আইটেম (Item) যোগ করে।
ধরা যাক, আমাদের একটি Users
টেবিল আছে যেখানে প্রতিটি ইউজারের জন্য UserID
, Name
, এবং Email
রয়েছে। একটি নতুন ইউজার যোগ করতে:
import boto3
# DynamoDB ক্লায়েন্ট তৈরি
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Users')
# নতুন আইটেম (ডেটা) ইনসার্ট করা
response = table.put_item(
Item={
'UserID': '001',
'Name': 'John Doe',
'Email': 'john.doe@example.com'
}
)
print("PutItem succeeded:", response)
এই কোডটি Users
টেবিলে একটি নতুন ইউজার যোগ করবে, যেখানে UserID
হল '001', নাম 'John Doe', এবং ইমেইল 'john.doe@example.com'।
DynamoDB তে ডেটা রিড করার জন্য GetItem
অপারেশন ব্যবহার করা হয়। এটি একটি নির্দিষ্ট আইটেম নিয়ে আসে তার প্রাইমারি কী (Primary Key) ব্যবহার করে।
response = table.get_item(
Key={
'UserID': '001'
}
)
item = response.get('Item')
if item:
print("User found:", item)
else:
print("User not found")
এই কোডটি UserID
'001' থাকা ইউজারের তথ্য নিয়ে আসবে।
DynamoDB তে আইটেম আপডেট করার জন্য UpdateItem
অপারেশন ব্যবহার করা হয়। এটি একটি নির্দিষ্ট আইটেমের যেকোনো অ্যাট্রিবিউট পরিবর্তন করতে সাহায্য করে।
response = table.update_item(
Key={
'UserID': '001'
},
UpdateExpression="set Email = :e",
ExpressionAttributeValues={
':e': 'john.new@example.com'
},
ReturnValues="UPDATED_NEW"
)
print("UpdateItem succeeded:", response)
এই কোডটি UserID
'001' থাকা ইউজারের ইমেইল আপডেট করবে।
DynamoDB তে আইটেম ডিলেট করার জন্য DeleteItem
অপারেশন ব্যবহার করা হয়। এটি একটি নির্দিষ্ট আইটেম ডিলিট করতে ব্যবহৃত হয়, যা প্রাইমারি কী ব্যবহার করে নির্ধারণ করা হয়।
response = table.delete_item(
Key={
'UserID': '001'
}
)
print("DeleteItem succeeded:", response)
এই কোডটি UserID
'001' থাকা ইউজারকে ডিলিট করবে।
DynamoDB তে একাধিক আইটেম একসাথে ইনসার্ট বা ডিলিট করতে BatchWriteItem
ব্যবহার করা হয়। এটি একাধিক PutItem
এবং DeleteItem
অপারেশন একসাথে করা সম্ভব করে।
with table.batch_writer() as batch:
batch.put_item(
Item={
'UserID': '002',
'Name': 'Jane Doe',
'Email': 'jane.doe@example.com'
}
)
batch.delete_item(
Key={
'UserID': '001'
}
)
এই কোডটি দুটি অপারেশন একসাথে করবে:
UserID
'002' ইউজারের তথ্য ইনসার্ট করবে।UserID
'001' ইউজারকে ডিলিট করবে।DynamoDB তে একাধিক অপারেশন করার সময়, কিছু শর্ত (condition) নির্ধারণ করতে পারেন। যেমন, যদি একটি আইটেম উপস্থিত থাকে বা না থাকে, তখন কিছু কার্যক্রম করতে।
response = table.put_item(
Item={
'UserID': '003',
'Name': 'Alice Smith',
'Email': 'alice.smith@example.com'
},
ConditionExpression="attribute_not_exists(UserID)"
)
print("PutItem succeeded:", response)
এই কোডটি শুধু তখন আইটেম ইনসার্ট করবে যখন UserID
'003' ইতিমধ্যে টেবিলে উপস্থিত না থাকে (অর্থাৎ নতুন ইউজার)। যদি ইউজারটি আগে থেকেই টেবিলে থাকে, তখন এটি ব্যর্থ হবে।
DynamoDB তে Query
অপারেশন ব্যবহার করে আপনি নির্দিষ্ট শর্ত অনুযায়ী ডেটা অনুসন্ধান করতে পারেন। এটি প্রাইমারি কী বা সোর্ট কী দ্বারা ডেটা অনুসন্ধান করতে সাহায্য করে।
response = table.query(
KeyConditionExpression=Key('UserID').eq('001')
)
for item in response['Items']:
print(item)
এই কোডটি UserID
'001' এর জন্য টেবিল থেকে সকল ডেটা ফিরিয়ে আনবে।
Scan
অপারেশনটি টেবিলের সমস্ত আইটেম স্ক্যান করে এবং সকল ডেটা ফিরে আনে। এটি সাধারণত বড় ডেটাসেটের জন্য কম কার্যকর, তবে সহজ কাজের জন্য ব্যবহার করা যেতে পারে।
response = table.scan()
for item in response['Items']:
print(item)
এই কোডটি টেবিলের সমস্ত আইটেম স্ক্যান করে এবং তাদের প্রদর্শন করবে।
DynamoDB তে ডেটা অপারেশনগুলি খুবই সহজ এবং দ্রুত করা যায়। এটি স্কেলেবল এবং উচ্চ পারফরম্যান্স অ্যাপ্লিকেশনগুলির জন্য আদর্শ, যেখানে সঠিকভাবে ডেটা রিড, রাইট, আপডেট এবং ডিলিট করা অত্যন্ত গুরুত্বপূর্ণ। PutItem, GetItem, UpdateItem, DeleteItem, Query, এবং Scan সহ অন্যান্য অপারেশনগুলি অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য মৌলিক কম্পোনেন্টস।
Amazon DynamoDB তে ডেটা অপারেশনগুলি (Insert, Update, Delete) খুবই গুরুত্বপূর্ণ এবং এগুলি মূলত টেবিলের মধ্যে Items (যেগুলি ডেটাবেসের রেকর্ড হিসাবে কাজ করে) পরিচালনা করতে ব্যবহৃত হয়। DynamoDB তে ডেটা পরিচালনার জন্য আপনি AWS Management Console, AWS CLI, অথবা AWS SDK (যেমন Python, JavaScript, Java) ব্যবহার করতে পারেন।
এখানে আমরা DynamoDB তে Insert, Update, এবং Delete অপারেশন কিভাবে করতে হবে তা আলোচনা করব।
PutItem অপারেশনটি একটি নতুন আইটেম ইনসার্ট করতে বা বিদ্যমান আইটেমের উপরে নতুন ডেটা লেখার জন্য ব্যবহৃত হয়। এই অপারেশনটি একটি নির্দিষ্ট টেবিলে নতুন আইটেম তৈরি করবে, যদি আইটেমটি আগে থেকে না থাকে।
Syntax:
import boto3
# DynamoDB ক্লায়েন্ট তৈরি
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('YourTableName')
# আইটেম ইনসার্ট করা
table.put_item(
Item={
'PrimaryKey': 'value1', # Primary key
'SortKey': 'value2', # Optional Sort key (যদি থাকে)
'Attribute1': 'Value1', # অন্যান্য অ্যান্ট্রিবিউট
'Attribute2': 'Value2'
}
)
UpdateItem অপারেশনটি একটি আইটেম আপডেট করার জন্য ব্যবহৃত হয়। এর মাধ্যমে আপনি পূর্বে ইনসার্ট করা আইটেমের কোন অ্যাট্রিবিউট বা ফিল্ড পরিবর্তন করতে পারেন।
Syntax:
import boto3
# DynamoDB ক্লায়েন্ট তৈরি
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('YourTableName')
# আইটেম আপডেট করা
table.update_item(
Key={
'PrimaryKey': 'value1', # Primary key
'SortKey': 'value2' # Sort key (যদি থাকে)
},
UpdateExpression="set Attribute1 = :val1",
ExpressionAttributeValues={
':val1': 'UpdatedValue'
},
ReturnValues="UPDATED_NEW"
)
DeleteItem অপারেশনটি একটি নির্দিষ্ট আইটেম ডিলিট করার জন্য ব্যবহৃত হয়, যা টেবিলের মধ্যে একটি Primary Key দ্বারা চিহ্নিত হয়।
Syntax:
import boto3
# DynamoDB ক্লায়েন্ট তৈরি
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('YourTableName')
# আইটেম ডিলিট করা
table.delete_item(
Key={
'PrimaryKey': 'value1', # Primary key
'SortKey': 'value2' # Sort key (যদি থাকে)
}
)
যদি আপনাকে একাধিক আইটেম ইনসার্ট বা ডিলিট করতে হয়, তবে আপনি BatchWriteItem অপারেশন ব্যবহার করতে পারেন।
Syntax:
import boto3
# DynamoDB ক্লায়েন্ট তৈরি
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('YourTableName')
# একাধিক আইটেম ইনসার্ট এবং ডিলিট করা
with table.batch_writer() as batch:
batch.put_item(Item={'PrimaryKey': 'value1', 'Attribute': 'value'})
batch.delete_item(Key={'PrimaryKey': 'value2'})
এই তিনটি অপারেশন আপনাকে DynamoDB তে ডেটা খুব সহজে ইনসার্ট, আপডেট এবং ডিলিট করতে সাহায্য করবে।
Batch Write এবং Batch Read অপারেশনগুলি DynamoDB-তে একাধিক রেকর্ড একসঙ্গে প্রক্রিয়া করার জন্য ব্যবহার করা হয়, যা পারফরম্যান্স এবং স্কেলেবিলিটি উন্নত করতে সাহায্য করে। এই অপারেশনগুলি আপনাকে একসাথে একাধিক ডেটা লিখতে এবং পড়তে অনুমতি দেয়, যার ফলে ডেটাবেসে অনেকগুলো রেকর্ড হ্যান্ডেল করার সময় দক্ষতা বাড়ে।
DynamoDB-তে Batch Write অপারেশন ব্যবহার করে আপনি একাধিক PutItem
বা DeleteItem
রেকর্ড একসাথে করতে পারেন। Batch Write অপারেশন 25টি পর্যন্ত একসঙ্গে রেকর্ড লেখার (Put) বা মুছে ফেলার (Delete) অনুমতি দেয়।
Batch Write অপারেশনটি দুইটি মূল অংশে বিভক্ত:
import boto3
# DynamoDB রিসোর্স তৈরি করা
dynamodb = boto3.resource('dynamodb', region_name='us-west-2')
table = dynamodb.Table('Movies')
# একাধিক আইটেম লেখা
with table.batch_writer() as batch:
batch.put_item(
Item={
'Year': 2024,
'Title': 'New Movie',
'Genre': 'Action'
}
)
batch.put_item(
Item={
'Year': 2023,
'Title': 'Another Movie',
'Genre': 'Drama'
}
)
# একাধিক আইটেম মুছে ফেলা
batch.delete_item(
Key={
'Year': 2020,
'Title': 'Old Movie'
}
)
Batch Read অপারেশন ব্যবহার করে আপনি একাধিক আইটেম একসাথে পড়তে পারেন। এটি BatchGetItem
API ব্যবহার করে, যেখানে আপনি একাধিক টেবিলের মধ্যে একাধিক রেকর্ড অনুরোধ করতে পারেন।
Batch Read অপারেশনটি একাধিক GetItem
রিকোয়েস্টের মাধ্যমে ডেটা একসঙ্গে পড়ে।
import boto3
# DynamoDB রিসোর্স তৈরি করা
dynamodb = boto3.resource('dynamodb', region_name='us-west-2')
table = dynamodb.Table('Movies')
# একাধিক আইটেম পড়া
response = table.batch_get_item(
RequestItems={
'Movies': {
'Keys': [
{'Year': 2024, 'Title': 'New Movie'},
{'Year': 2023, 'Title': 'Another Movie'}
]
}
}
)
# রেসপন্স থেকে আইটেমগুলি বের করা
items = response['Responses']['Movies']
for item in items:
print(item)
GetItem
রিকোয়েস্টের সংখ্যা কমানো যায়।Amazon DynamoDB একটি অত্যন্ত দ্রুত এবং স্কেলেবল NoSQL ডেটাবেস। এটি বিভিন্ন ধরনের ডেটা অপারেশন এবং কনক্রিট ট্রানজেকশনাল কন্ট্রোল সাপোর্ট করে। Condition Expressions এবং Optimistic Locking দুটি গুরুত্বপূর্ণ কনসেপ্ট, যা ডেটাবেস অপারেশনের সঠিকতা এবং ডেটার কনসিস্টেন্সি নিশ্চিত করতে ব্যবহৃত হয়।
Condition Expressions হল DynamoDB-এর একটি ফিচার যা আপনাকে ডেটাবেস অপারেশনের আগে নির্দিষ্ট শর্ত বা কন্ডিশন যাচাই করতে দেয়। আপনি যখন একটি PutItem, UpdateItem, বা DeleteItem অপারেশন চালান, তখন Condition Expression ব্যবহার করে এটি নির্ধারণ করতে পারবেন যে অপারেশনটি সফল হবে কিনা।
Condition Expression একটি ফিল্ডের মান নির্দিষ্ট শর্ত পূরণ করছে কিনা তা চেক করে এবং কেবলমাত্র সেই শর্ত পূর্ণ হলে অপারেশনটি সম্পন্ন হয়।
উদাহরণস্বরূপ, যদি আপনি একটি UpdateItem অপারেশন চালান এবং চান যে সেটি কেবল তখনই সম্পন্ন হোক যখন একটি নির্দিষ্ট attribute (যেমন "status") একটি নির্দিষ্ট মানে রয়েছে, আপনি Condition Expression ব্যবহার করতে পারেন।
{
"TableName": "Users",
"Key": {
"UserID": {"S": "user123"}
},
"UpdateExpression": "SET #status = :newStatus",
"ConditionExpression": "#status = :expectedStatus",
"ExpressionAttributeNames": {
"#status": "status"
},
"ExpressionAttributeValues": {
":newStatus": {"S": "Active"},
":expectedStatus": {"S": "Pending"}
}
}
এখানে:
Optimistic Locking একটি কৌশল যেখানে ডেটার সংশোধন বা আপডেট করার সময় আমরা আশা করি ডেটাতে কোনো কনফ্লিক্ট হবে না, এবং শুধুমাত্র যখন অন্য কেউ ডেটা পরিবর্তন করে না তখনই আমরা আমাদের পরিবর্তনটি সফলভাবে অ্যাপ্লাই করি।
DynamoDB তে Optimistic Locking এর মাধ্যমে, আপনি Condition Expressions ব্যবহার করে ডেটার versioning নিশ্চিত করতে পারেন। এই পদ্ধতিতে, প্রতিটি Item একটি version (অথবা timestamp) ফিল্ড ধারণ করে। যখন আপনি একটি UpdateItem অপারেশন চালান, আপনি নিশ্চিত করেন যে আপনি যে versionটি চেক করছেন, সেটি কোনো পরিবর্তন ছাড়াই আছে।
ধরা যাক, আপনার একটি "Product" টেবিল রয়েছে, যেখানে প্রতিটি আইটেমের একটি "version" অ্যাট্রিবিউট রয়েছে। যখন আপনি ডেটা আপডেট করতে চান, আপনি নিশ্চিত করতে চান যে অন্য কেউ এই আইটেমটি পরিবর্তন করেনি।
UpdateItem API এর মধ্যে ConditionExpression ব্যবহার করা:
{
"TableName": "Products",
"Key": {
"ProductID": {"S": "prod123"}
},
"UpdateExpression": "SET price = :newPrice, version = version + :increment",
"ConditionExpression": "version = :currentVersion",
"ExpressionAttributeValues": {
":newPrice": {"N": "299.99"},
":currentVersion": {"N": "1"},
":increment": {"N": "1"}
}
}
এখানে:
এই দুটি কৌশলই DynamoDB-তে ডেটা অপারেশনের নিরাপত্তা এবং সঠিকতা বজায় রাখার জন্য অপরিহার্য।
DynamoDB তে ডেটা অনুসন্ধান (retrieve) করার জন্য দুটি প্রধান অপারেশন রয়েছে: Query এবং Scan। এগুলি ডেটার মধ্যে তথ্য বের করার জন্য ব্যবহৃত হয়, তবে তাদের কার্যকারিতা এবং কার্যকলাপে কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে।
Query অপারেশন DynamoDB তে একটি নির্দিষ্ট টেবিল বা ইনডেক্স থেকে ডেটা সিলেক্ট করার জন্য ব্যবহৃত হয়, যেখানে আপনি Primary Key (Partition Key বা Partition Key + Sort Key) ব্যবহার করে নির্দিষ্ট আইটেম খুঁজে পান।
ধরা যাক, আপনার একটি Users টেবিল রয়েছে, এবং আপনি একটি নির্দিষ্ট UserID এর সকল তথ্য বের করতে চান। এটি করার জন্য আপনি Query অপারেশন ব্যবহার করবেন, যেটি UserID এর ভিত্তিতে ডেটা ফিরিয়ে দেবে।
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Users')
response = table.query(
KeyConditionExpression=Key('UserID').eq('12345')
)
items = response['Items']
print(items)
Scan অপারেশন সম্পূর্ণ টেবিল বা ইনডেক্সের মধ্যে ডেটা অনুসন্ধান করে। এটি একটি ব্রুট-ফোর্স পদ্ধতি, যেখানে প্রতিটি আইটেম স্ক্যান করে ফলাফল তৈরি করা হয়।
ধরা যাক, আপনি আপনার Users টেবিল থেকে সকল ব্যবহারকারীর নাম বের করতে চান যারা নির্দিষ্ট শহরে বাস করে। এটি করার জন্য আপনি Scan অপারেশন ব্যবহার করবেন:
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Users')
response = table.scan(
FilterExpression=Attr('City').eq('Dhaka')
)
items = response['Items']
print(items)
Feature | Query | Scan |
---|---|---|
Speed | Faster (Efficient, works with Primary Key/Index) | Slower (Scans entire table) |
Data Retrieval | Retrieves data based on a specific condition (Primary Key or Index) | Scans all items and filters results based on conditions |
Use Case | Ideal for looking up a specific item or a range of items | Used for less specific or full-table searches |
Capacity Usage | Consumes fewer read capacity units (RCU) | Consumes more read capacity units (RCU) |
Filtering | Filtering possible after Query, but efficient | Filtering can be applied, but less efficient due to full scan |
Performance | More efficient for large datasets | Less efficient, especially with large datasets |
common.read_more